import csv
import io

import pandas as pd
from aiogram import Bot, Dispatcher, F
from aiogram.filters import Text
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import any_state
from aiogram.types import BufferedInputFile, Message, ReplyKeyboardRemove

from app.bot.states.states import Convert


async def start_convert(message: Message, state: FSMContext) -> None:
    """
    Конвертирование в txt
    """

    await message.answer(
        "Пришлите файл в формате xls, а я верну его вам в txt",
        reply_markup=ReplyKeyboardRemove(),
    )
    await message.answer("Отправьте /cancel, чтобы вернуться в главное меню")
    await state.set_state(Convert.waiting_file)


async def file_sent(message: Message, bot: Bot, state: FSMContext) -> None:
    if ".xls" not in message.document.file_name:
        await message.answer("Вы прислали не xls файл")
    else:
        file_name = message.document.file_name.split(".")[0]
        file = io.BytesIO()
        await bot.download(message.document, destination=file)
        file.seek(0)
        data = pd.read_excel(file)
        df = pd.DataFrame(data)
        if "Фото для селфи" in df.keys():
            del df["Фото для селфи"]
        if "Пароль от почты" in df.keys():
            if df["Пароль от почты"].empty == False:
                df["Пароль от почты"] = "UA"
        txt = df.to_csv(
            header=None,
            index=None,
            sep="\t",
            quoting=csv.QUOTE_NONE,
            mode="a",
            escapechar="\\",
        ).encode()
        await bot.send_document(
            message.chat.id, BufferedInputFile(txt, f"{file_name}.txt")
        )
        await state.clear()


def register_convert_handlers(dp: Dispatcher):
    dp.message.register(
        start_convert,
        Text(text="♻️ Конвертировать .xls в .txt", ignore_case=True),
        any_state,
    )
    dp.message.register(
        file_sent,
        Convert.waiting_file,
        F.content_type == "document",
    )
